#ifndef ICD_H
#define ICD_H

#include <stdint.h>

// 固定包长度定义
#define PACKET_FIXED_LENGTH 1024


// 指令类型枚举
typedef enum {
    ICD_HANDSHAKE = 0x01,     // 握手指令
    ICD_MODE_SET = 0x02,      // 模式设置
    ICD_ACQ_CTRL = 0x03,      // 采集控制，状态查询 
    ICD_DATA_TRANSFER = 0x04,  // 数据传输
    ICD_DATA_TRANSFER_RIO = 0x14,  // 数据传输内部用
    ICD_DATA_TRANSFER_RIOEND = 0x15  // 数据传输内部用
} IcdCommandType;


// 通用协议头（包含固定包头和包尾）
typedef struct {
    uint32_t header_flag;     // 固定包头 0xA55AA55A
    uint8_t command_type;    // 指令类型
    uint8_t payload[PACKET_FIXED_LENGTH - 9]; // 数据域（1024-17=1007字节）
    uint32_t tail_flag;       // 固定包尾 0xDEADDEAD
} IcdPacket;

 
// 握手响应
 typedef struct {
    uint32_t header_flag;     // 固定包头 0xA55AA55A
    uint8_t command_type;    // 指令类型 
    // ZYNQ0 网络信息
    uint8_t zynq_phy_addr;  // 物理地址 
    uint8_t backup1[3];         // 备份

    // ZYNQ0 状态
    uint8_t zynq_speed: 1;       // 网口速度
    uint8_t zynq_link: 1;        // 网口链接状态
    uint8_t zynq_reserved : 3;      // 保留三个bit
    uint8_t zynq_ddr: 1;         // DDR状态
    uint8_t zynq_clock: 1;       // 时钟状态
    uint8_t zynq_fault: 1;       // 是否故障
    uint8_t backup3[4];        // 字节备份

    int16_t main_temp;         // 主ZYNQ温度（0.1℃）
    int32_t bakup4;          // 备份
    
    uint32_t main_uptime;      // 主运行时间（小端）
    uint32_t main_acq_count;   // 主采集次数
    

    uint8_t reserved[992];   // 保留剩余字节
    uint32_t tail_flag;       // 固定包尾 0xDEADDEAD
} HandResponse; 

 
// 工作模式设置结构体 
typedef struct {
    uint32_t header_flag;     // 固定包头 0xA55AA55A
    uint8_t command_type;    // 指令类型
    uint8_t zynq_phy_addr;  // ZYNQ0 物理地址
    uint8_t status;          
    uint8_t zynq_sample_duration; // ZYNQ0 采样时长
    uint8_t zynq_sample_freq;     // ZYNQ0 采样频率
    uint8_t zynq_channel_info[5];       // 20个通道信息，每个字节表示四个通道，共5字节
                                   // 每个通道2位，高到低分别为通道4，3，2，1
                                   // 每位含义：bit1 - 采集模式，bit0 - 采集/不采集



    uint8_t reserved[1005]; // 计算保留字节数，保证结构体大小为1024字节

    
    uint32_t tail_flag;       // 固定包尾 0xDEADDEAD
} ModeSetResponse; 


// 状态查询响应 
typedef struct {
    uint32_t header_flag;     // 固定包头 0xA55AA55A
    uint8_t command_type;    // 指令类型 
    // ZYNQ0 网络信息
    uint8_t zynq_phy_addr;  // 物理地址 
    // ZYNQ0 通道采集状态
    uint8_t zynq_channel_status[3]; // 按位存储20个通道采集状态
                                   // 第一个字节：通道4 - 1，低四位保留
                                   // 第二个字节：通道12 - 5
                                   // 第三个字节：通道20 - 13


    uint8_t zynq_channel_completestatus[3]; // 按位存储20个通道采集状态


 
    uint8_t reserved[1008];   // 保留剩余字节
    uint32_t tail_flag;       // 固定包尾 0xDEADDEAD
} StatusQueryResponse;  



// 数据传输 
typedef struct {
    uint32_t header_flag;     // 固定包头 0xA55AA55A
    uint8_t command_type;    // 指令类型 
    // ZYNQ 网络信息
    uint8_t zynq_phy_addr;  // 物理地址 
    // ZYNQ 通道采集状态
    uint8_t zynq_sample_status; 

    uint8_t channel; 
    uint32_t packets_num;     // 总包数 (小端序)
    uint32_t packet_index;    // 当前包号 (小端序)
    uint32_t packet_valid_len; // 当前包有效数据长度 (小端序)
 
    uint8_t data[1000];   // 数据区1000字节
    uint32_t tail_flag;       // 固定包尾 0xDEADDEAD
} DataTransferResponse;  



// 字节序转换宏
#define ntoh16(x) 			( ((x)<<8) | ((x)>>8) )
#define hton16(x) 			ntoh16(x)





#endif
